package com.powernode.reflect;

import com.powernode.reflect.pojo.MyAnnotation;
import com.powernode.reflect.pojo.Person;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.time.Period;

/**
 *
 * 反射：
 *      对方法的操作
 * @author : zjj
 * @date : 2022/9/22 10:08
 */
public class TestReflect06 {

    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
//        getAllMethod();
        testExecuteMethod();
    }

    public static void getAllMethod() throws ClassNotFoundException {
        Class personClass = Class.forName("com.powernode.reflect.pojo.Person");
        // 获取所有
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println("方法的名称：" + method.getName());
            int modifiers = method.getModifiers();
            System.out.println("方法的修饰符：" + Modifier.toString(modifiers));
            Parameter[] parameters = method.getParameters();
            for (Parameter parameter : parameters) {
                System.out.println("\t 参数类型 ："+parameter.getType()+" 参数名称：" + parameter.getName());
            }

            Annotation[] annotations = method.getAnnotations();
            for (Annotation annotation : annotations) {
                System.out.println("注解：" + annotation);
                if( annotation instanceof MyAnnotation){
                    String username = ((MyAnnotation)annotation).username();
                    int count = ((MyAnnotation) annotation).count();
                    System.out.println("\t 注解的值，username ： " + username + ",count : " +count);
                }
            }

            // 方法的返回类型
            Class<?> returnType = method.getReturnType();
            System.out.println("方法的返回值：" + returnType.getSimpleName());

            System.out.println();
        }
    }

    /**
     * 确定一个方法的四要素 ：
     *      1.方法所属的对象
     *      2.方法名称
     *      3.方法的参数类型个数
     *      4.方法的返回值
     */
    public static void testDecompileMethod() throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Class personClass = generateClass();

    }

    public static void testExecuteMethod() throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Class personClass = generateClass();
        // 获取到具体的方法 ： 方法名称 ，方法参数类型
        Method eatMethod = personClass.getDeclaredMethod("eat", String.class, String.class);

        // 调用方法的对象
        Person person = (Person) personClass.newInstance();

        // 执行方法
        Object invoke = eatMethod.invoke(person, "烤肉", "晚餐");
        System.out.println(invoke);
    }


    public static Class generateClass(){
        Class personClass = null;
        try {
            personClass = Class.forName("com.powernode.reflect.pojo.Person");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return personClass;
    }
}
